package com.shenwei.yingdaoguanli.service.impl;

import com.shenwei.yingdaoguanli.entity.FileStat;
import com.shenwei.yingdaoguanli.entity.dto.FileStatDto;
import com.shenwei.yingdaoguanli.entity.vo.FileStatVo;
import com.shenwei.yingdaoguanli.mapper.FileStatMapper;
import com.shenwei.yingdaoguanli.service.FileStatService;
import com.shenwei.yingdaoguanli.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.*;


/**
 * @Author wang
 * @Date 2025/1/8 22:45
 * @PackageName:com.shenwei.yingdaoguanli.service.impl
 * @ClassName: FileStatServiceImpl
 * @Description: TODO
 * @Version 1.0
 */
@Service
public class FileStatServiceImpl implements FileStatService {

    @Autowired
    private FileStatMapper fileStatMapper;

    @Override
    public int startStat(String directoryPath) {
        File directory = new File(directoryPath);
        if (!directory.isDirectory()) {
            throw new IllegalArgumentException("这个路径不是一个目录");
        }

        // 获取所有末级文件夹中的文件
        List<File> files = collectFilesFromLeafDirectories(directory);

        // 将文件信息插入数据库，使用批量插入优化性能
        List<FileStat> fileStats = new ArrayList<>(files.size());
        for (File file : files) {
            FileStat fileStat = new FileStat();
            fileStat.setFilePath(file.getParent());
            fileStat.setFileName(file.getName());
            fileStat.setFileSize(file.length());
            fileStat.setFileType(getFileType(file.getName()));
            fileStat.setModifiedDate(DateUtils.format(new Date(file.lastModified()), DateUtils.YYYY_MM_DD_HH_MM_SS)); // 格式化时间
            fileStat.setStatTime(DateUtils.format(new Date(), DateUtils.YYYY_MM_DD_HH_MM_SS)); // 当前统计时间

            fileStats.add(fileStat);
        }

        // 批量插入数据库
        if (!fileStats.isEmpty()) {
            fileStatMapper.insertBatch(fileStats);
        }

        return files.size();
    }

    /**
     * 递归查找末级文件夹中的所有文件
     */
    private List<File> collectFilesFromLeafDirectories(File directory) {
        List<File> files = new ArrayList<>();
        Queue<File> directoriesQueue = new LinkedList<>();
        directoriesQueue.offer(directory);

        while (!directoriesQueue.isEmpty()) {
            File dir = directoriesQueue.poll();
            File[] fileList = dir.listFiles();

            if (fileList == null || fileList.length == 0) {
                continue; // 空目录跳过
            }

            for (File file : fileList) {
                if (file.isDirectory()) {
                    directoriesQueue.offer(file); // 如果是子目录，加入队列
                } else {
                    files.add(file); // 如果是文件，直接添加
                }
            }
        }

        return files;
    }


    @Override
    public List<FileStatVo> getLatestFileStatsByStatDate(FileStatDto fileStatDto) {

        return fileStatMapper.getLatestFileStatsByStatDate(fileStatDto);
    }

    @Override
    public List<FileStat> getFileStatsByDirectoryAndStatDate(FileStatDto fileStatDto) {
        return fileStatMapper.getFileStatsByDirectoryAndStatDate(fileStatDto);
    }

    @Override
    public boolean deleteTodayStats(String today) {

        try {
            // 调用 Mapper 删除对应路径和日期的统计数据
            fileStatMapper.deleteStatsByDate(today);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public List<FileStatVo> getTodayFileStats(FileStatDto fileStatDto) {
        return fileStatMapper.getTodayFileStats(fileStatDto);
    }


    private String getFileType(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        return (dotIndex == -1) ? "Unknown" : fileName.substring(dotIndex + 1);
    }
}